/*
 * в этом файле хранится класс Sphere и его наследники
 * для создания экземпляров предпочтительно пользоваться фабрикой
 */
/**
 * Фабрика для создания сфер
 * @param {Game} game
 */
function SphereFactory(game){
    var _game = game;
	var prop = _game.getProp();
    
    /**
     * Создать экземпляр сферы
     * @param {float} rad
     * @param {float} posX
     * @param {float} posY
     * @param {float} impX
     * @param {float} impY
     */
    this.createPassiveSphere = function(rad, posX, posY, impX, impY){
        var sph = new Sphere(rad, posX, posY, impX, impY);
        _game.list.push(sph);
        //return sph;
    }
    
    /**
     * Создать экземпляр сферы
     * @param {float} rad
     * @param {float} posX
     * @param {float} posY
     * @param {float} impX
     * @param {float} impY
     */
    this.createActiveSphere = function(rad, posX, posY, impX, impY){
        var sph = new Sphere(rad, posX, posY, impX, impY);
        makeSphActive(sph);
        _game.list.push(sph);
        //return sph;
    }
    
    /**
     * Сделать экземпляр активной сферой
     * @param {Sphere} inst
     */
    function makeSphActive(inst){
        inst.sphType = "active";
        
        inst.generate = function(X, Y){
            var sin = Y / Math.sqrt(X * X + Y * Y);
            var cos = X / Math.sqrt(X * X + Y * Y);
            var div = 40; // во сколько раз созданный объект меньше по массе родителя
            var speed = 150; // скорость, с которой вылетает созданный объект
            if (inst.rad > div * 2) { // запрещаем создавать объекты маленьким шарикам		
                var genRad = inst.rad * Math.pow(1 / div, 1 / 3);
				_game.list.push(new Sphere(
						genRad,
						inst.pos.x + (genRad + inst.rad) * cos,
						inst.pos.y + (genRad + inst.rad) * sin,
						speed * cos,
						speed * sin
					));
                inst.rad = inst.rad * Math.pow(1 - 1 / div, 1 / 3);
                inst.setImp(inst.imp.x - speed * cos / div, inst.imp.y - speed * sin / div);
            }
        }
    }
}

function Sphere(rad, posX, posY, impX, impY){
    this.rad = rad; // размер
    this.pos = {
        x: posX,
        y: posY
    }; // положение
    this.imp = {
        x: impX,
        y: impY
    }; // импульс
    this.sphType = "passive";
    
    this.setPos = function(x, y){
        this.pos.x = x;
        this.pos.y = y;
    }
    
    this.setImp = function(x, y){
        this.imp.x = x;
        this.imp.y = y;
    }
}
